import { Position, TetrominoType, TETROMINO_COLORS } from './Position';

/**
 * 方块形状定义（4x4矩阵）
 * 每种方块有4个旋转状态（0度、90度、180度、270度）
 */
const TETROMINO_SHAPES: Record<TetrominoType, number[][][]> = {
    [TetrominoType.I]: [
        [[0, 0, 0, 0], [1, 1, 1, 1], [0, 0, 0, 0], [0, 0, 0, 0]],
        [[0, 0, 1, 0], [0, 0, 1, 0], [0, 0, 1, 0], [0, 0, 1, 0]],
        [[0, 0, 0, 0], [0, 0, 0, 0], [1, 1, 1, 1], [0, 0, 0, 0]],
        [[0, 1, 0, 0], [0, 1, 0, 0], [0, 1, 0, 0], [0, 1, 0, 0]]
    ],
    [TetrominoType.O]: [
        [[0, 1, 1, 0], [0, 1, 1, 0], [0, 0, 0, 0], [0, 0, 0, 0]],
        [[0, 1, 1, 0], [0, 1, 1, 0], [0, 0, 0, 0], [0, 0, 0, 0]],
        [[0, 1, 1, 0], [0, 1, 1, 0], [0, 0, 0, 0], [0, 0, 0, 0]],
        [[0, 1, 1, 0], [0, 1, 1, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
    ],
    [TetrominoType.T]: [
        [[0, 1, 0, 0], [1, 1, 1, 0], [0, 0, 0, 0], [0, 0, 0, 0]],
        [[0, 1, 0, 0], [0, 1, 1, 0], [0, 1, 0, 0], [0, 0, 0, 0]],
        [[0, 0, 0, 0], [1, 1, 1, 0], [0, 1, 0, 0], [0, 0, 0, 0]],
        [[0, 1, 0, 0], [1, 1, 0, 0], [0, 1, 0, 0], [0, 0, 0, 0]]
    ],
    [TetrominoType.S]: [
        [[0, 1, 1, 0], [1, 1, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]],
        [[0, 1, 0, 0], [0, 1, 1, 0], [0, 0, 1, 0], [0, 0, 0, 0]],
        [[0, 0, 0, 0], [0, 1, 1, 0], [1, 1, 0, 0], [0, 0, 0, 0]],
        [[1, 0, 0, 0], [1, 1, 0, 0], [0, 1, 0, 0], [0, 0, 0, 0]]
    ],
    [TetrominoType.Z]: [
        [[1, 1, 0, 0], [0, 1, 1, 0], [0, 0, 0, 0], [0, 0, 0, 0]],
        [[0, 0, 1, 0], [0, 1, 1, 0], [0, 1, 0, 0], [0, 0, 0, 0]],
        [[0, 0, 0, 0], [1, 1, 0, 0], [0, 1, 1, 0], [0, 0, 0, 0]],
        [[0, 1, 0, 0], [1, 1, 0, 0], [1, 0, 0, 0], [0, 0, 0, 0]]
    ],
    [TetrominoType.J]: [
        [[1, 0, 0, 0], [1, 1, 1, 0], [0, 0, 0, 0], [0, 0, 0, 0]],
        [[0, 1, 1, 0], [0, 1, 0, 0], [0, 1, 0, 0], [0, 0, 0, 0]],
        [[0, 0, 0, 0], [1, 1, 1, 0], [0, 0, 1, 0], [0, 0, 0, 0]],
        [[0, 1, 0, 0], [0, 1, 0, 0], [1, 1, 0, 0], [0, 0, 0, 0]]
    ],
    [TetrominoType.L]: [
        [[0, 0, 1, 0], [1, 1, 1, 0], [0, 0, 0, 0], [0, 0, 0, 0]],
        [[0, 1, 0, 0], [0, 1, 0, 0], [0, 1, 1, 0], [0, 0, 0, 0]],
        [[0, 0, 0, 0], [1, 1, 1, 0], [1, 0, 0, 0], [0, 0, 0, 0]],
        [[1, 1, 0, 0], [0, 1, 0, 0], [0, 1, 0, 0], [0, 0, 0, 0]]
    ]
};

/**
 * 俄罗斯方块类
 */
export class Tetromino {
    public type: TetrominoType;
    public position: Position;
    public rotation: number; // 0-3，表示4个旋转状态
    public color: string;

    constructor(type: TetrominoType, position: Position = { x: 3, y: 0 }, rotation: number = 0) {
        this.type = type;
        this.position = { ...position };
        this.rotation = rotation;
        this.color = TETROMINO_COLORS[type];
    }

    /**
     * 获取当前旋转状态下的形状矩阵
     */
    getShape(): number[][] {
        return TETROMINO_SHAPES[this.type][this.rotation];
    }

    /**
     * 获取所有占位的单元格坐标（相对于游戏棋盘）
     */
    getCells(): Position[] {
        const shape = this.getShape();
        const cells: Position[] = [];

        for (let y = 0; y < 4; y++) {
            for (let x = 0; x < 4; x++) {
                if (shape[y][x] === 1) {
                    cells.push({
                        x: this.position.x + x,
                        y: this.position.y + y
                    });
                }
            }
        }

        return cells;
    }

    /**
     * 旋转方块（顺时针）
     * @returns 新的旋转状态
     */
    rotate(): number {
        this.rotation = (this.rotation + 1) % 4;
        return this.rotation;
    }

    /**
     * 逆时针旋转（用于旋转回退）
     */
    rotateBack(): number {
        this.rotation = (this.rotation + 3) % 4;
        return this.rotation;
    }

    /**
     * 移动方块
     */
    move(deltaX: number, deltaY: number): void {
        this.position.x += deltaX;
        this.position.y += deltaY;
    }

    /**
     * 创建方块的副本
     */
    clone(): Tetromino {
        return new Tetromino(this.type, { ...this.position }, this.rotation);
    }

    /**
     * 随机生成一个方块
     */
    static random(): Tetromino {
        const types = Object.values(TetrominoType);
        const randomType = types[Math.floor(Math.random() * types.length)];
        return new Tetromino(randomType);
    }
}

